package projectisd.client;

import projectisd.client.KlasDelegate;

import java.util.List;


import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.HTMLTable.Cell;

/** 
 * In deze klas wordt de interface aangeroepen om een Vak te kunnen toevoegen
 * in de webbrowse
 * @author Team 2
 * @version 7.0
 */

public class KlasGUI {
	/* Constants. */
	private static final String LISTING_ROOT_PANEL = "guiListing";
	private static final String FORM_ROOT_PANEL = "guiForm";
	private static final String STATUS_ROOT_PANEL = "guiStatus";
	private static final String TOOL_BAR_ROOT_PANEL = "guiToolBar";
	private static final int EDIT_LINK = 3;
	private static final int REMOVE_LINK = 4;

	/* GUI Widgets */
	protected Button addButton;
	protected Button updateButton;
	protected Button addNewButton;
	protected TextBox klasNaamField;
	protected ListBox selecteerOpleidingList;
	protected Label selecteerOpleiding;
	protected Label titel;
	protected Label status;
	protected Grid listGrid;
	protected Grid formGrid;
	protected Image hulogo;

	/* Data model */
	private List<Klas> klassen;
	private Klas currentKlas;
	protected KlasDelegate klasService;

	/** 
	 * In deze methode worden alle Widgets gemaakt die later weer kunnen worden opgehaald
	 */
	
	public void init() {
		addButton = new Button("Toevoegen");
		addNewButton = new Button("Klas Toevoegen");
		updateButton = new Button("Update klas");
		hulogo = new Image("http://jansen-schoonhoven.com/Downloads/hulogo.jpg");
		klasNaamField = new TextBox();
		klasNaamField.setVisibleLength(25);

		selecteerOpleiding = new Label();
		selecteerOpleidingList = new ListBox();
		selecteerOpleidingList.addItem("Informatica");
		selecteerOpleidingList.addItem("Information Engineering");
		selecteerOpleidingList.addItem("Systeembeheer");
		selecteerOpleidingList.addItem("Technische Informatica");
		selecteerOpleidingList.addItem("Bedrijfskundige Informatica");
		selecteerOpleidingList.setVisibleItemCount(1);

		titel = new Label("Klassen beheren");
		status = new Label();
		listGrid = new Grid(2,6);

		buildForm();
		placeWidgets();
	}
	
	/** 
	 * Hier in worden de widgets gebruikt in de Buildform waar in een grid wordt gebruikt
	 * om de widgets te plaatsen op het scherm
	 */

	private void buildForm() {
		formGrid = new Grid(5,3);
		formGrid.setVisible(false);

		formGrid.setWidget(0, 0, titel);
		formGrid.setWidget(0, 2, hulogo);
		formGrid.setWidget(1, 0, new Label("Klasnaam"));
		formGrid.setWidget(1, 1, klasNaamField);

		formGrid.setWidget(2, 0, new Label("Selecteer opleiding"));
		formGrid.setWidget(2, 1, selecteerOpleidingList);

		formGrid.setWidget(3, 1, updateButton);
		formGrid.setWidget(3, 0, addButton);
	}
	
	/** 
	 * Hier in worden de widgets zoals listgrid formgrid en status geplaats in
	 * de rootpanel 
	 */

	private void placeWidgets() {
		RootPanel.get(LISTING_ROOT_PANEL).add(listGrid);
		RootPanel.get(FORM_ROOT_PANEL).add(formGrid);
		RootPanel.get(STATUS_ROOT_PANEL).add(status);
		RootPanel.get(TOOL_BAR_ROOT_PANEL).add(addNewButton);
	}
	
	/** 
	 * In deze methode wordt uitgevoerd om bepaalde widgets te kunnen hiden als deze wordt aangeroepen
	 */

	public void hideGui() {
		formGrid.setVisible(false);
		listGrid.setVisible(false);
		status.setVisible(false);
		addNewButton.setVisible(false);
	}
	
	/** 
	 * In deze methode wordt het formulier aangeroepen wat de gebruiker
	 * kan invullen	
	 */


	private void loadForm(Klas klas) {
		this.formGrid.setVisible(true);
		currentKlas = klas;
		selecteerOpleiding.setText(selecteerOpleidingList.getItemText(selecteerOpleidingList.getSelectedIndex()));
		this.klasNaamField.setText(klas.getKlasnaam());
		this.selecteerOpleiding.setText(klas.getSelecteeropleiding());
	}
	
	/** 
	 * In deze methode wordt een Klas opgeslagen in de database
	 * 
	 */


	private void copyFieldDateToKlas() {
		currentKlas.setKlasnaam(klasNaamField.getText());
		selecteerOpleiding.setText(selecteerOpleidingList.getItemText(selecteerOpleidingList.getSelectedIndex()));
		currentKlas.setSelecteeropleiding(selecteerOpleiding.getText());
	}
	
	/** 
	 * In deze methode wordt verteld wanneer bepaalde knoppen 
	 * zichtbaar mogen zijn zodra er een bepaalde knop wordt geselecteerd
	 * 
	 */

	public void gui_eventListGridClicked(Cell cellClicked) {
		int row = cellClicked.getRowIndex();
		int col = cellClicked.getCellIndex();

		Klas klas = this.klassen.get(row);
		this.status.setText("Naam was " + klas.getKlasnaam() + " clicked ");

		if (col==EDIT_LINK) {
			this.addNewButton.setVisible(false);
			this.updateButton.setVisible(true);
			this.addButton.setVisible(false);
			loadForm(klas);
		} else if (col==REMOVE_LINK) {
			if (Window.confirm("Verwijderen klas?")) {
				this.klasService.removeKlas(klas);
			}
		}
	}
	
	/** 
	 * In deze methode staat wat er moet gebeuren voordat op Addbutton wordt
	 * geclickt voordat de ingevulde gegevens worden opgeslagen.
	 */

	public void gui_eventAddButtonClicked() {
		if	(klasNaamField.getText().length() == 0 && 
				selecteerOpleiding.getText().length() == 0)
		{	Window.alert("Alle velden moeten gevuld zijn");

		} else {
			addNewButton.setVisible(true);
			formGrid.setVisible(false);
			copyFieldDateToKlas();
			this.klasService.addKlas(currentKlas);
		}
	}
	
	/** 
	 * In deze methode staat wat er moet gebeuren voordat op Updatebutton wordt
	 * geclickt voordat de ingevulde gegevens worden opgeslagen.
	 */

	public void gui_eventUpdateButtonClicked() {
		if	(klasNaamField.getText().length() == 0 && 
				selecteerOpleiding.getText().length() == 0)
		{	Window.alert("Alle velden moeten gevuld zijn");

		} else {
			addNewButton.setVisible(true);
			formGrid.setVisible(false);
			copyFieldDateToKlas();
			this.klasService.updateKlas(currentKlas);
		}
	}
	
	/** 
	 * In deze methode staat wat er moet gebeuren voordat er op de
	 * knop AddnewButton wordt geklikt er wordt hier dus het formulier
	 * getoont wat in de buildform wordt gemaakt
	 */

	public void gui_eventAddNewButtonClicked() {
		this.addNewButton.setVisible(false);
		this.updateButton.setVisible(false);
		this.addButton.setVisible(true);
		Klas klas = new Klas();
		loadForm(klas);
	}
	
	/** 
	 * In deze methode wordt de lijst getoont met een for
	 */


	public void service_eventListRetrievedFromService(List<Klas> result) {
		status.setText("Retrieved klas list");
		status.setVisible(true);

		//formGrid.setVisible(false);
		listGrid.setVisible(true);
		status.setVisible(true);
		addNewButton.setVisible(true);

		this.klassen = result;
		this.listGrid.clear();
		this.listGrid.resizeRows(this.klassen.size());
		int row = 0;
		this.addNewButton.setVisible(true);

		for (Klas klas : result) {
			this.listGrid.setWidget(row, 0, new Label (klas.getKlasnaam()));
			this.listGrid.setWidget(row, 1, new Label (klas.getSelecteeropleiding()));
			this.listGrid.setWidget(row, EDIT_LINK, new Hyperlink("Edit", null));
			this.listGrid.setWidget(row, REMOVE_LINK, new Hyperlink("Remove", null));
			row ++;
		}
	}
	
	/** 
	 * In deze methode wordt verteld of de gegevens goed zijn toegevoegd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventAddKlasSuccessful() {
		status.setText("Klas was successfully added");
		this.klasService.listKlassen();
	}
	
	/** 
	 * In deze methode wordt verteld of de date goed is geupdated
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventUpdateSuccessful() {
		status.setText("Klas was successfully updated");
		this.klasService.listKlassen();
	}
	
	/** 
	 * In deze methode wordt verteld of de date goed is verwijderd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */
	
	public void service_eventRemoveKlasSuccessful() {
		status.setText("Klas was removed");
		this.klasService.listKlassen();
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed is geupdated
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventUpdateKlasFailed(Throwable caught) {
		status.setText("Update klas failed");
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed is toegevoegd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventAddKlasFailed(Throwable caught) {
		status.setText("Unable to update klas");
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed is verwijderd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventRemoveKlasFailed(Throwable caught) {
		status.setText("Remove klas failed");
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed wordt getoont
	 * in de lijst
	 */

	public void service_eventListKlasFailed(Throwable caught) {
		status.setText("Unable to get klas list");

	}

}
